package com.shakespace.effectivejava.edition3.chapter10;

/**
 * 异常只适用于确有异常的情况；它们不应该用于一般的控制流程。
 *
 * 一个设计良好的 API 不能迫使其客户端为一般的控制流程使用异常。
 * 只有在某些不可预知的条件下才能调用具有「状态依赖」方法的类，
 * 通常应该有一个单独的「状态测试」方法，表明是否适合调用「状态依赖」方法。
 * 例如，Iterator 接口具有「状态依赖」的 next 方法和对应的「状态测试」方法 hasNext。
 *
 *
 * 有一些指导原则，帮助你在「状态测试」方法、Optional、可识别的返回值之间进行选择。
 * （1）如果要在没有外部同步的情况下并发地访问对象，或者受制于外部条件的状态转换，则必须使用 Optional 或可识别的返回值，因为对象的状态可能在调用「状态测试」方法与「状态依赖」方法的间隔中发生变化。
 * （2）如果一个单独的「状态测试」方法重复「状态依赖」方法的工作，从性能问题考虑，可能要求使用 Optional 或可识别的返回值。
 * （3）在所有其他条件相同的情况下，「状态测试」方法略优于可识别的返回值。它提供了较好的可读性，而且不正确的使用可能更容易被检测：如果你忘记调用「状态测试」方法，「状态依赖」方法将抛出异常，使错误显而易见；
 * （4）如果你忘记检查一个可识别的返回值，那么这个 bug 可能很难发现。但是这对于返回 Optional 对象的方式来说不是问题。
 */
public class E069_ExceptionHandle {

}
